[PHP] Wat is sneller?
10 februari 2012Uit pure interesse kwam bij mij de vraag naar boven: wat is sneller? Het verdubbelen van getallen met behulp van integers, of via bitwise vermenigvuldiging. De resultaten zijn verrassend en niet zo eenduidig als ik dacht.
Onderaan deze pagina kun je overigens de broncode vinden. De 'wedstrijd' zat in een benchmark tussen het verdubbelen van een getal via een bitwise operator of via een vermenigvuldiging in de code zelf. Hierin onderscheiden we twee statements:
$a = $a * 2;
$a = $a << 1;
Beide voeren in deze test exact hetzelfde uit. De benchmark luidt als volgt:
Benchmark when multiplying integers ($a = $a * 2): 3.00854706764 Result: 2147483648 Benchmark using bitwise operators ($a = $a << 1): 2.77816987038 Result: 2147483648 Difference in speed: 0.230377197266
Wat nu het geval lijkt te zijn, is dat bitwise operators net iets sneller zijn dan het vermenigvuldigen van integers. Op zich binnen de lijn der verwachting.
Nu is de notatie $a = $a * 2; nogal veel typwerk voor de gemiddelde programmeur. Met andere woorden, hoe zit het dan als ook de notaties $a *= 2; en $a <<= 1; worden meegenomen in de benchmark?
Benchmark when multiplying integers ($a = $a * 2): 3.00854706764 Result: 2147483648 Benchmark using bitwise operators ($a = $a << 1): 2.77816987038 Result: 2147483648 Difference in speed: 0.230377197266 Benchmark when multiplying integers ($a *= 2): 2.58673095703 Result: 2147483648 Benchmark using bitwise operators: ($a <<= 1)2.43510198593 Result: 2147483648 Difference in speed: 0.1516289711
Met andere woorden: het gebruiken van korte operators is een stuk sneller dan dubbele operators. Dat is logisch te verklaren, maar het maakt een groot verschil. Sterker nog: bij het gebruiken van een 'korte' notatie voor integers, is de code sneller dan bij het gebruiken van een lange notatie voor bits.
Benchmarkgegevens reproduceren? Geen probleem. Code:
<?php
$start = microtime(true);
for($t = 0; $t < 1000000; $t++)
{
$a = 2;
for($i = 0; $i < 30; $i++)
{
$a = $a * 2;
}
}
$end = microtime(true);
$bench1 = $end - $start;
echo("Benchmark when multiplying integers (\$a = \$a * 2): " . $bench1 . PHP_EOL);
echo("Result: " . $a . PHP_EOL);
$start = microtime(true);
for($t = 0; $t < 1000000; $t++)
{
$a = 2;
for($i = 0; $i < 30; $i++)
{
$a = $a << 1;
}
}
$end = microtime(true);
$bench2 = $end - $start;
echo("Benchmark using bitwise operators (\$a = \$a << 1): " . $bench2 . PHP_EOL);
echo("Result: " . $a . PHP_EOL);
$difference = $bench1 - $bench2;
echo(PHP_EOL . PHP_EOL . "Difference in speed: " . $difference . PHP_EOL . PHP_EOL);
$start = microtime(true);
for($t = 0; $t < 1000000; $t++)
{
$a = 2;
for($i = 0; $i < 30; $i++)
{
$a *= 2;
}
}
$end = microtime(true);
$bench1 = $end - $start;
echo("Benchmark when multiplying integers (\$a *= 2): " . $bench1 . PHP_EOL);
echo("Result: " . $a . PHP_EOL);
$start = microtime(true);
for($t = 0; $t < 1000000; $t++)
{
$a = 2;
for($i = 0; $i < 30; $i++)
{
$a <<= 1;
}
}
$end = microtime(true);
$bench2 = $end - $start;
echo("Benchmark using bitwise operators: (\$a <<= 1)" . $bench2 . PHP_EOL);
echo("Result: " . $a . PHP_EOL);
$difference = $bench1 - $bench2;
echo(PHP_EOL . PHP_EOL . "Difference in speed: " . $difference);
?>
Internet Marketing
Een zoekmachine bouwen #8 - PageRank, Zoeken, etc.Geplaatst op 5 december 2019
Een zoekmachine bouwen #7 - Backlinks & Tabellen
Geplaatst op 22 juli 2018
Een zoekmachine bouwen #6 - Full page cache
Geplaatst op 13 juli 2018
Een zoekmachine bouwen #5 - Een stap verder
Geplaatst op 11 juli 2018
Auteur: Edwin Dijk
TimeTick producten
Urenregistratie software
Gratis urenregistratie software